﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Text;
using System.Text.RegularExpressions;

namespace 序列化工具
{
    /// <summary>
    /// 用于将对象序列化或反序列化的工具类，该类封装了序列化器与反序列化器的使用
    /// </summary>
    internal class SerializationTools
    {
        /// <summary>
        /// 储存序列化或反序列化信息的动态列表
        /// </summary>
        List<值结构> 实例信息集 = new List<值结构>();

        /*
         * 序列规则：
         * 基础字段 [值的类型]<类完整路径>变量名=值
         * 动态列表 [值的类型]<类完整路径>变量名#List[序号]=值
         * 字典[值的类型]<类完整路径>变量名#Dict[序号].(Key或Value)=值
         * 嵌套类[值的类型]<类完整路径>子类#变量名=值
       */

        /// <summary>
        /// 将实例序列化为文本，可通过后续的方法取出
        /// </summary>
        /// <param name="实例"></param>
        /// <returns></returns>
        public static SerializationTools Serialization(object 实例)
        {
            SerializationTools 序列化 = new SerializationTools();
            序列化.实例信息集 = 序列化器.序列化类(实例);
            return 序列化;
        }


        /// <summary>
        /// 从文本进行反序列化，返回反序列化后的实例
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="序列化文本"></param>
        /// <returns></returns>
        public static T Deserialization<T>(string 序列化文本) where T:class
        {
           var 实例信息集 =  从文件读取到实例信息集(序列化文本);
            //整理层级数据以方便反序列化类读取
            值结构.整理层级数据(实例信息集);
            var 对象实例 = Activator.CreateInstance(typeof(T)) as T;
            return 反序列化器.为实例添加信息(对象实例, 实例信息集);
        }


        /// <summary>
        /// 用于整理序列化后信息的方法
        /// </summary>
        /// <param name="序列化文本"></param>
        /// <returns></returns>
        private static List<值结构> 从文件读取到实例信息集(string 序列化文本)
        {
            List<值结构> 待反序列化信息集 = new List<值结构>();
            var 匹配结果集 = Regex.Matches(序列化文本, "\\[(.*?)\\](.*?)=(.*)");
            foreach (Match 匹配结果 in 匹配结果集)
            {
                var 值结构 = new 值结构()
                {
                    类型文本 = 匹配结果.Groups[1].Value.ToString().Trim('\r'),
                    绝对路径 = 匹配结果.Groups[2].Value.ToString().Trim('\r'),
                    值文本 = 匹配结果.Groups[3].Value.ToString().Trim('\r'),
                };
                值结构.类型 = Type.GetType(值结构.类型文本);
                待反序列化信息集.Add(值结构);
            }

            return 待反序列化信息集;
        }

        /// <summary>
        /// 取得序列化后的文本
        /// </summary>
        /// <returns></returns>
        public string GetText()
        {
            StringBuilder 文本文档 = new StringBuilder();
            foreach (var 实例信息 in 实例信息集)
            {
                文本文档.AppendLine($"[{实例信息.类型文本}]{实例信息.绝对路径}={实例信息.值文本}");
            }
            return 文本文档.ToString();
        }

        /// <summary>
        /// 将序列化后的文本储存到文件
        /// </summary>
        /// <param name="储存路径"></param>
        public void SavaToFile(string 储存路径)
        {
            StringBuilder 文本文档 = new StringBuilder();
            foreach (var 实例信息 in 实例信息集)
            {
                文本文档.AppendLine($"[{实例信息.类型文本}]{实例信息.绝对路径}={实例信息.值文本}");
            }
            System.IO.File.WriteAllText(储存路径, 文本文档.ToString());
        }
    }
}
